package com.philosophy.web.domain.generate;

/**
 * 生成短链接的模板类
 *
 * @author philosophy
 */
public abstract class AbstractGenerateShortUrl {

    /**
     * 最大值
     */
    protected final long threshold;

    /**
     * 生成的短URL的位数
     */
    protected final int shortUrlLength = 6;

    //初始化最大值
    {
        long val = 1;
        for (int i = 0; i < shortUrlLength; i++) {
            val = val * 62;
        }
        threshold = val;
    }

    /**
     * <p>
     * 根据原始URL生成短URL,不同的原始URL由于哈希碰撞可能会得到相同的短URL,
     * 所以需要调用方重试,或者其他操作来保证其唯一性
     * </p>
     *
     * @param originUrl 原始URL
     * @return 短URL
     */
    public UrlMapping generateShortUrl(String originUrl) {
        String salt = getSalt();
        long hash = getStrIdentity(originUrl + salt);
        return new UrlMapping(Base62Encode.toBase62String(hash), originUrl, salt);
    }

    /**
     * 获取字符串的唯一标识
     *
     * @param str 字符串
     * @return hash值
     */
    protected abstract long getStrIdentity(String str);


    /**
     * 子类实现如果需要对原始url进行处理加盐，则可以重写该函数
     *
     * @return 盐值
     */
    protected abstract String getSalt();
}
